// ========================================================================================
// ========================================================================================
// 文件名:    Com.h
// 描  述:    串行通信管理模块
// ========================================================================================
// 版  本:    V1.00
// 日  期:    
// 作  者:    
// 注  释:    
// ========================================================================================

#ifndef COM_H
#define COM_H

// ========================================================================================
// Includes
// ========================================================================================



// ========================================================================================
// Macro & Types & Constants Declares 宏、结构体及常数申明
// ========================================================================================
enum
{
	COM_UART_PARITY_NULL = 0,   //无校验（No Parity）
	COM_UART_PARITY_ODD,		//奇校验（Odd Parity）
	COM_UART_PARITY_EVEN,		//偶校验（Even Parity）
};

// 定义cpu内部串口号
enum
{
	ARM4_UART1 = 0,				
	ARM4_UART2,			
	ARM4_UART3,			
	ARM4_UART4,				
	ARM4_UART5,				
	ARM4_UART6,
	ARM4_UART7,
	ARM4_UART8,
	COMDRV_PORT_MAX,
};

// 通信端口驱动定义
typedef struct
{
	const char *pName;									// 名称
	void (*Init)(u32 dwBaudrateNo, u8 ParityMode); 		// 端口初始化
	void (*DeInit)(u32 dwBaudrateNo, u8 ParityMode); 	// 端口反初始化
	u16 (*Read)(u8 *pcBufs, u16 wMaxLen);				// 接收数据，返回收到的字节个数
	u16 (*Write)(u8 *pcBufs, u16 wLength); 				// 发送数据，返回发送(实际上为成功提交)的字节个数
	u16 (*GetRxedLen)(void);							// 得到新接收到的字符数(指底层已经收到但还没有提交到应用层的字符个数)
	u8 (*IsTxIDLE)(void);								// 是否发送空闲
	u8 (*IsRxIDLE)(void);								// 是否接收空闲
	u8 (*IsIDLE)(void);									// 是否空闲(包括发送和接收)
	//void (*StopRx)(void);								// 停止接收 暂时不支持
	//void (*StartRx)(void);							// 启动接收 暂时不支持
	void (*Enable)(void);								// 端口使能 
	void (*Disable)(void);								// 端口停止 
}COMM_DEV_S;

// 通信控制块定义
typedef struct 
{
	const COMM_DEV_S *pDrv;
	u32 Speed;
	u32 Ticker;
	u16 frmIntv;				// 帧间隔
	u16 newRxedLen;				// 结合帧间隔，用于判断是否收到新帧
	u8 Parity;
	u8 PortNO;
	
	u8*	pRxBuf;
	u8*	pTxBuf;
	u16 RxedLen;
	u16 TxLen;
	u16 MaxRxLen;						// 接收buf的最大/可用长度
	u16 MaxTxLen;						// 接收buf的最大/可用长度
}COMM_CTRL_TYPE;


// 串口底层驱动缓冲定义
typedef struct
{
	u8 *RxBuf;							// 指向接收缓冲区首址
	u16 RxRdIndex;						// 接收缓冲区的读位置
	u16 RxWrIndex;						// 接收缓冲区的写位置
	u8 *TxBuf;							// 指向发送缓冲区首址
	u16 TxRdIndex;						// 发送缓冲区的读位置
	u16 TxWrIndex;						// 发送缓冲区的写位置
	u8 RxNULLFlag;
	u8 TxNULLFlag;
}UART_BUF_TYPE;

// ----------------------------------------------------------------------------------------
// 本地通信1 
#define COM_PORT_LOCAL_COM1				ARM4_UART3

#define UART1_HARD_BUF_SIZE				255


//用于ID配置表格的定义
#define	Type_BcdStr				0
#define	Type_HexStr				1
#define	Type_BcdData			2
#define	Type_ASCII				3
#define	Type_YMDHM				4
#define	Type_SignBCD			5		// 带符号的BCD数据,比如功率,需量等
#define	Type_StatData			6		// 统计数据
#define	Type_TariffPara			7		// 时区时段表数据


// ========================================================================================
// Variable Declares 全局变量申明
// ========================================================================================
extern const u32 g_bps[8];
extern const COMM_DEV_S Drv_CommList[COMDRV_PORT_MAX] ;
extern COMM_CTRL_TYPE PLCCom; 


// ========================================================================================
// Functions Declares 全局函数申明
// ========================================================================================
u16 COM_GetFrmIntv(u32 speed);
u8  COM_HasNewFrm(COMM_CTRL_TYPE *pCom);
u8  IsCommAllow(void);

#endif
// ========================================================================================
// End
// ========================================================================================